{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'src'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[9], line 4\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mutils\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m evaluate, plotLearningCurve\n\u001b[1;32m      3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mjson\u001b[39;00m\n\u001b[0;32m----> 4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mmodels\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m WarcraftShortestPathNet\n",
      "File \u001b[0;32m~/Research/Implicit-Networks/fpo-dys/src/warcraft/models.py:5\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mcvxpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mcp\u001b[39;00m\n\u001b[1;32m      4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mcvxpylayers\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtorch\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m CvxpyLayer \n\u001b[0;32m----> 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msrc\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdys_opt_net\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m DYS_opt_net\n\u001b[1;32m      6\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpyepo\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmodel\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mgrb\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m shortestPathModel\n\u001b[1;32m      7\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtorchvision\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmodels\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m resnet18\n",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'src'"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from utils import evaluate, plotLearningCurve\n",
    "import json\n",
    "from models import WarcraftShortestPathNet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./results/mse-loss/grid_size_12/DYS.json\n"
     ]
    }
   ],
   "source": [
    "## Load the training statistics\n",
    "target_file = './results/mse-loss/grid_size_12/DYS.json'\n",
    "print(target_file)\n",
    "with open(target_file) as file:\n",
    "    data = json.load(file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'WarcraftShortestPathNet' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[8], line 2\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;66;03m## Load the model and weights\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m nnet \u001b[38;5;241m=\u001b[39m \u001b[43mWarcraftShortestPathNet\u001b[49m\n\u001b[1;32m      3\u001b[0m weights_path \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m./saved_weights/DYS/best.pth\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m      4\u001b[0m nnet\u001b[38;5;241m.\u001b[39mload_state_dict(torch\u001b[38;5;241m.\u001b[39mload(path))\n",
      "\u001b[0;31mNameError\u001b[0m: name 'WarcraftShortestPathNet' is not defined"
     ]
    }
   ],
   "source": [
    "## Load the model and weights\n",
    "nnet = WarcraftShortestPathNet\n",
    "weights_path = './saved_weights/DYS/best.pth'\n",
    "nnet.load_state_dict(torch.load(path))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_mse_loss_hist = data[\"train_mse_loss_hist\"]\n",
    "test_regret_hist = data['test_regret_hist']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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duzYoc2bN5/1LyOn/qxOVzAu9evX99judDpVu3Zta3+BatWqefzlRPprrDdv3nyOsyu6M41Dfn6+XnnlFU2ZMkXp6ekec5GvuOIK22NWrFix0NiEhoZa14Ydu+vy119/lY+PT6HeT7/WzqVq1aqaOnWqpkyZoh07dmjJkiV67rnnNHr0aFWtWlX333+/duzYIUnnnMKRlZVVpOsZuBwRmgGUuIK7Vffcc89Zf0EXrIbw7rvvqk+fPurSpYuGDx+uiIgI+fr6avz48frpp58Kve70u4in8vX1PeP2gjtt51Kc1xZFgwYNJElbtmxR69atbesdDscZ3/v0D58VONu49OzZU3379lVqaqqaN2+uefPmqV27dtY8Vemvn9ett96qxx577IzHqFevnm2/RVXa43ymcXjmmWf0f//3f7rvvvs0btw4ValSRT4+Pho6dGiR7qyereeiKu1zPpXD4VC9evVUr149derUSVdddZVmz56t+++/3zrX559/vtBnBQqc79J0wOWE0AygxIWHh6ty5crKy8tTQkLCOWs/+OAD1a5dWx9++KHHHcjTP7zmbTVq1JAk7dy50+OO4KFDh4p0x7Fz584aP3683n333SKF5tDQ0DP+8//pd27tdOnSRQMGDLCmaPz4448aOXKkR02dOnWUnZ1t+7M6k4JxSUtLU+3ata3tubm5Sk9Pv6BjlrQPPvhAbdu21ZtvvumxPTMz0+MvD95So0YN5efnKz09XVdddZW1fefOncU6bu3atRUaGqq9e/dK+uvnLP31rx52P5fT/zUAAEvOASgFvr6+6t69u/73v/9p69athfafupRbwV24U++6rV27VmvWrCn9Rs9Du3bt5Ofnp6lTp3psP3XZtnOJj49Xhw4dNH36dC1YsKDQ/tzcXD366KPW8zp16uiHH37wGKtNmzZ5LA1WFCEhIUpMTNS8efM0Z84cOZ1OdenSxaPmzjvv1Jo1a7RkyZJCr8/MzNTJkyfPevyEhAQ5nU69+uqrHj/DN998U1lZWUVeAaI0+fr6FrqrO3/+fO3evdtLHXlKTEyU9Neyfad67bXXivT6tWvX6ujRo4W2r1u3TocOHbKmzsTGxqpOnTp64YUXzvgtgadea5UqVZIkvhEQOAV3mgFcsLfeesv6ENOphgwZomeffVbLli1TXFyc+vfvr4YNG+rw4cPasGGDvvzySx0+fFiSdPvtt+vDDz9U165d1alTJ6Wnp2vatGlq2LDhBX39b2mJjIzUkCFD9OKLL+qOO+5Qhw4dtGnTJi1atEhhYWFFujM3a9YstW/fXt26dVPnzp3Vrl07VapUSTt27NCcOXO0d+9ea63m++67Ty+99JISExPVr18/7d+/X9OmTVOjRo2K9MHGU/Xo0UP33HOPpkyZosTExEJzqocPH65PPvlEt99+u/r06aPY2FgdPXpUW7Zs0QcffKBffvnlrHdkw8PDNXLkSI0dO1YdOnTQHXfcobS0NE2ZMkXXXnvtOb985GK5/fbb9dRTT6lv3766/vrrtWXLFs2ePdvjzrg3xcbGqnv37po4caIOHTpkLTlX8LXqdtfWO++8o9mzZ6tr166KjY2V0+nU999/r7feeksVK1bUE088IUny8fHR9OnT1bFjRzVq1Eh9+/bVlVdeqd27d2vZsmUKCgrSp59+avUkSaNGjVLPnj1VoUIFde7c2QrTwOWI0Azggp1+17VAnz59VK1aNa1bt05PPfWUPvzwQ02ZMkVXXHGFGjVqVGh92oyMDL3++utasmSJGjZsqHfffVfz58/X8uXLL9KZFM1zzz2ngIAA/fe//9WXX36p+Ph4ffHFF7rxxhuL9G1w4eHhWr16taZMmaK5c+dq1KhRys3NVY0aNXTHHXdoyJAhVu3VV1+tWbNmafTo0Ro2bJgaNmyod955R++99955j8sdd9whf39/HTlyxGPVjAIBAQFasWKFnnnmGc2fP1+zZs1SUFCQ6tWrp7Fjxyo4OPicx09KSlJ4eLgmTZqkRx55RFWqVNEDDzygZ5555oK/krokPfHEEzp69Kjee+89zZ07V9dcc40WLlyoxx9/3NutWWbNmqWoqCi9//77+uijj5SQkKC5c+eqfv36ttfWgAEDFBAQoKVLl+rjjz+W2+1WeHi42rdvr5EjR6pFixZW7c0336w1a9Zo3LhxmjRpkrKzsxUVFaW4uDgNGDDAqrv22ms1btw4TZs2TYsXL7amjxCacTlzmNL4JAIAXCYyMzMVGhqq//znPyX2NdiA9NcScS1atNC7776rXr16ebsd4LLHnGYAKKJjx44V2lbwbXln+sproKjOdm35+Pjopptu8kJHAE7H9AwAKKK5c+dq5syZuu222xQYGKhvvvlG77//vtq3b68bbrjB2+2hHJswYYJSUlLUtm1b+fn5adGiRVq0aJEeeOABxcTEeLs9AGJ6BgAU2YYNG/TYY48pNTVVbrdbkZGR6t69u/7zn/+wvi2KJTk5WWPHjtX27duVnZ2t6tWr695779WoUaPk58f9LaAsIDQDAAAANpjTDAAAANggNAMAAAA2mChVSvLz87Vnzx5VrlyZryMFAAAog4wxOnLkiKKjo+Xjc+57yYTmUrJnzx4+8QwAAFAO/Pbbb6pWrdo5awjNpaRy5cqS/vohBAUFebkbAAAAnM7tdismJsbKbedCaC4lBVMygoKCCM0AAABlWFGm0vJBQAAAAMAGoRkAAACwQWgGAAAAbBCaAQAAABuEZgAAAMAGoRkAAACwQWgGAAAAbBCaAQAAABuEZgAAAMAG3wjoJT/++ae2Hj2q6i6XWvKNgQAAAGUad5q95JODB9V92za9tnu3t1sBAACADUIzAAAAYIPQDAAAANggNAMAAAA2CM0AAACADUIzAAAAYIPQDAAAANggNAMAAAA2CM0AAACADUIzAAAAYIPQDAAAANggNAMAAAA2CM1eZrzdAAAAAGwRmr3E4XB4uwUAAAAUEaEZAAAAsEFoBgAAAGyUqdA8fvx4XXvttapcubIiIiLUpUsXpaWledQcP35cgwYN0hVXXKHAwEB1795d+/bt86jZtWuXOnXqpICAAEVERGj48OE6efKkR83y5ct1zTXXyOVyqW7dupo5c2ahfiZPnqyaNWuqYsWKiouL07p160r8nAEAAFD2lanQvGLFCg0aNEjffvutkpOTdeLECbVv315Hjx61ah555BF9+umnmj9/vlasWKE9e/aoW7du1v68vDx16tRJubm5Wr16td5++23NnDlTo0ePtmrS09PVqVMntW3bVqmpqRo6dKjuv/9+LVmyxKqZO3euhg0bpjFjxmjDhg1q1qyZEhMTtX///oszGAAAACgzHMaYMruAw4EDBxQREaEVK1bopptuUlZWlsLDw/Xee+/p73//uyTphx9+0NVXX601a9aoVatWWrRokW6//Xbt2bNHkZGRkqRp06ZpxIgROnDggJxOp0aMGKGFCxdq69at1nv17NlTmZmZWrx4sSQpLi5O1157rSZNmiRJys/PV0xMjB566CE9/vjjhXrNyclRTk6O9dztdismJkZZWVkKCgoqVP/ib7/p0Z9+0r2RkZp19dUlN2gAAAAoErfbreDg4LPmtVOVqTvNp8vKypIkValSRZKUkpKiEydOKCEhwapp0KCBqlevrjVr1kiS1qxZoyZNmliBWZISExPldru1bds2q+bUYxTUFBwjNzdXKSkpHjU+Pj5KSEiwak43fvx4BQcHW4+YmJjinj4AAADKiDIbmvPz8zV06FDdcMMNaty4sSQpIyNDTqdTISEhHrWRkZHKyMiwak4NzAX7C/adq8btduvYsWM6ePCg8vLyzlhTcIzTjRw5UllZWdbjt99+u7ATBwAAQJnj5+0GzmbQoEHaunWrvvnmG2+3UiQul0sul8vbbQAAAKAUlMk7zYMHD9Znn32mZcuWqVq1atb2qKgo5ebmKjMz06N+3759ioqKsmpOX02j4LldTVBQkPz9/RUWFiZfX98z1hQcAwAAAJePMhWajTEaPHiwPvroI3311VeqVauWx/7Y2FhVqFBBS5cutbalpaVp165dio+PlyTFx8dry5YtHqtcJCcnKygoSA0bNrRqTj1GQU3BMZxOp2JjYz1q8vPztXTpUqsGAAAAl48yNT1j0KBBeu+99/Txxx+rcuXK1vzh4OBg+fv7Kzg4WP369dOwYcNUpUoVBQUF6aGHHlJ8fLxatWolSWrfvr0aNmyoe++9VxMmTFBGRoaefPJJDRo0yJo+8eCDD2rSpEl67LHHdN999+mrr77SvHnztHDhQquXYcOGqXfv3mrZsqWuu+46TZw4UUePHlXfvn1L9JzL7NIlAAAAsJSp0Dx16lRJ0s033+yxfcaMGerTp48k6eWXX5aPj4+6d++unJwcJSYmasqUKVatr6+vPvvsMw0cOFDx8fGqVKmSevfuraeeesqqqVWrlhYuXKhHHnlEr7zyiqpVq6bp06crMTHRqunRo4cOHDig0aNHKyMjQ82bN9fixYsLfTgQAAAAl74yvU5zeWa37l/BOs33REbqHdZpBgAAuOgumXWaL2UObzcAAACAIiM0AwAAADYIzQAAAIANQjMAAABgg9AMAAAA2CA0AwAAADYIzQAAAIANQjMAAABgg9AMAAAA2CA0AwAAADYIzV7Gt5gDAACUfYRmAAAAwAahGQAAALBBaPYSh7cbAAAAQJERmgEAAAAbhGYAAADABqEZAAAAsEFoBgAAAGwQmgEAAAAbhGYAAADABqEZAAAAsEFoBgAAAGwQmgEAAAAbhGYvM95uAAAAALYIzQAAAIANQjMAAABgg9DsJQ5vNwAAAIAiIzQDAAAANgjNAAAAgA1CMwAAAGCD0AwAAADYIDQDAAAANgjNAAAAgA1CMwAAAGCD0AwAAADYIDR7mfF2AwAAALBFaAYAAABsEJoBAAAAG4RmAAAAwAah2UscDoe3WwAAAEAREZoBAAAAG4RmAAAAwAahGQAAALBBaAYAAABsEJoBAAAAG4RmAAAAwAahGQAAALBBaAYAAABsEJq9zHi7AQAAANgiNAMAAAA2CM0AAACADUIzAAAAYIPQDAAAANggNHuJw9sNAAAAoMjKVGheuXKlOnfurOjoaDkcDi1YsMBjf58+feRwODweHTp08Kg5fPiwevXqpaCgIIWEhKhfv37Kzs72qNm8ebNat26tihUrKiYmRhMmTCjUy/z589WgQQNVrFhRTZo00eeff17i5wsAAIDyoUyF5qNHj6pZs2aaPHnyWWs6dOigvXv3Wo/333/fY3+vXr20bds2JScn67PPPtPKlSv1wAMPWPvdbrfat2+vGjVqKCUlRc8//7ySkpL0xhtvWDWrV6/WXXfdpX79+mnjxo3q0qWLunTpoq1bt5b8SQMAAKDM8/N2A6fq2LGjOnbseM4al8ulqKioM+77/vvvtXjxYn333Xdq2bKlJOm1117TbbfdphdeeEHR0dGaPXu2cnNz9dZbb8npdKpRo0ZKTU3VSy+9ZIXrV155RR06dNDw4cMlSePGjVNycrImTZqkadOmleAZAwAAoDwoU3eai2L58uWKiIhQ/fr1NXDgQB06dMjat2bNGoWEhFiBWZISEhLk4+OjtWvXWjU33XSTnE6nVZOYmKi0tDT98ccfVk1CQoLH+yYmJmrNmjVn7SsnJ0dut9vjAQAAgEtDuQrNHTp00KxZs7R06VI999xzWrFihTp27Ki8vDxJUkZGhiIiIjxe4+fnpypVqigjI8OqiYyM9KgpeG5XU7D/TMaPH6/g4GDrERMTU7yTBQAAQJlRpqZn2OnZs6f15yZNmqhp06aqU6eOli9frnbt2nmxM2nkyJEaNmyY9dztdhOcAQAALhHl6k7z6WrXrq2wsDDt3LlTkhQVFaX9+/d71Jw8eVKHDx+25kFHRUVp3759HjUFz+1qzjaXWvprrnVQUJDHAwAAAJeGch2af//9dx06dEhVq1aVJMXHxyszM1MpKSlWzVdffaX8/HzFxcVZNStXrtSJEyesmuTkZNWvX1+hoaFWzdKlSz3eKzk5WfHx8SV+DsaYEj8mAAAASlaZCs3Z2dlKTU1VamqqJCk9PV2pqanatWuXsrOzNXz4cH377bf65ZdftHTpUv3tb39T3bp1lZiYKEm6+uqr1aFDB/Xv31/r1q3TqlWrNHjwYPXs2VPR0dGSpLvvvltOp1P9+vXTtm3bNHfuXL3yyiseUyuGDBmixYsX68UXX9QPP/ygpKQkrV+/XoMHD77oYwIAAADvK1Ohef369WrRooVatGghSRo2bJhatGih0aNHy9fXV5s3b9Ydd9yhevXqqV+/foqNjdXXX38tl8tlHWP27Nlq0KCB2rVrp9tuu0033nijxxrMwcHB+uKLL5Senq7Y2Fj9+9//1ujRoz3Wcr7++uv13nvv6Y033lCzZs30wQcfaMGCBWrcuPHFGwwAAACUGQ7D/IBS4Xa7FRwcrKysrDPOb3719981ZOdO9QgP15xGjbzQIQAAwOXNLq+dqkzdaQYAAADKIkKzlzi83QAAAACKjNAMAAAA2CA0AwAAADYIzQAAAIANQjMAAABgg9AMAAAA2CA0AwAAADYIzV7GN8sAAACUfYRmAAAAwAahGQAAALBBaAYAAABsEJoBAAAAG4RmAAAAwAah2Usc3m4AAAAARUZoBgAAAGwQmgEAAAAbhGYAAADABqEZAAAAsEFoBgAAAGwQmgEAAAAbhGYvM95uAAAAALYIzQAAAIANQjMAAABgg9AMAAAA2CA0AwAAADYIzQAAAIANQrOXOBwOb7cAAACAIiI0AwAAADYIzQAAAIANQjMAAABgg9AMAAAA2CA0AwAAADYIzV5mvN0AAAAAbBGaAQAAABvFCs27du3SN99847Ft06ZN+uc//6kePXpowYIFxTk8AAAAUCb4FefFDz/8sLKzs/Xll19Kkvbt26e2bdsqNzdXlStX1gcffKD58+erW7duJdIsAAAA4A3FutO8bt063XrrrdbzWbNm6dixY9q0aZN2796tdu3a6YUXXih2kwAAAIA3FSs0Hz58WBEREdbzzz77TG3atFGdOnXk4+Ojbt266Ycffih2kwAAAIA3FSs0h4eH69dff5UkZWZm6ttvv1ViYqK1/+TJkzp58mTxOgQAAAC8rFhzmhMSEvTqq68qKChIy5cvV35+vrp06WLt3759u2JiYorb4yXJ4e0GAAAAUGTFCs3PPvusfvzxRz366KNyOp164YUXVKtWLUlSTk6O5s2bp7vvvrtEGgUAAAC8pVihOTIyUqtWrVJWVpb8/f3ldDqtffn5+Vq6dCl3mgEAAFDuFSs0FwgODi60zd/fX82aNSuJwwMAAABeVawPAi5dulTPP/+8x7a33npL1atXV2RkpB555BHl5eUVq0EAAADA24oVmpOSkrRp0ybr+ZYtWzRgwACFh4fr5ptv1quvvso6zQAAACj3ihWav//+e7Vs2dJ6/s477ygoKEhff/215s6dq/79+2vWrFnFbvJSZozxdgsAAACwUazQfPToUQUFBVnPFy9erA4dOiggIECSdO2111rrOAMAAADlVbFCc0xMjL777jtJ0s6dO7V161a1b9/e2n/48GG5XK7idQgAAAB4WbFWz+jVq5eeeuop7d69W9u2bVNoaKj+9re/WftTUlJUr169YjcJAAAAeFOxQvOoUaOUm5urzz//XNWrV9fMmTMVEhIi6a+7zMuXL9eQIUNKok8AAADAa4oVmv38/PT000/r6aefLrSvSpUqysjIKM7hAQAAgDKhRL7cRJKys7P122+/SfprrnNgYGBJHRoAAADwqmJ9EFCSvvvuO7Vt21ahoaFq3LixGjdurNDQUN1yyy1av359SfQIAAAAeFWxQvPatWt10003acOGDbr//vv18ssv6+WXX9b999+vDRs26KabbtK6deuKfLyVK1eqc+fOio6OlsPh0IIFCzz2G2M0evRoVa1aVf7+/kpISNCOHTs8ag4fPqxevXopKChIISEh6tevn7Kzsz1qNm/erNatW6tixYqKiYnRhAkTCvUyf/58NWjQQBUrVlSTJk30+eefF31gisBRokcDAABAaSpWaB41apSuvPJKpaWlaerUqXr44Yf18MMPa+rUqUpLS1N0dLRGjRpV5OMdPXpUzZo10+TJk8+4f8KECXr11Vc1bdo0rV27VpUqVVJiYqKOHz9u1fTq1Uvbtm1TcnKyPvvsM61cuVIPPPCAtd/tdqt9+/aqUaOGUlJS9PzzzyspKUlvvPGGVbN69Wrddddd6tevnzZu3KguXbqoS5cu2rp16wWMEgAAAMo9UwyBgYFmwoQJZ93/3HPPmcDAwAs6tiTz0UcfWc/z8/NNVFSUef75561tmZmZxuVymffff98YY8z27duNJPPdd99ZNYsWLTIOh8Ps3r3bGGPMlClTTGhoqMnJybFqRowYYerXr289v/POO02nTp08+omLizMDBgwocv9ZWVlGksnKyjrj/im//260bJnpvmVLkY8JAACAkmOX105VrDvNPj4+Onny5Fn35+Xlycen2NOmJUnp6enKyMhQQkKCtS04OFhxcXFas2aNJGnNmjUKCQnx+GrvhIQE+fj4aO3atVbNTTfdJKfTadUkJiYqLS1Nf/zxh1Vz6vsU1BS8z5nk5OTI7XZ7PAAAAHBpKFaivf766zV58uQzflX2rl27NGXKFN1www3FeQtLwfJ1kZGRHtsjIyOtfRkZGYqIiPDY7+fn57H8XUZGxhmPcep7nK3mXEvojR8/XsHBwdYjJibmfE8RAAAAZVSxlpx75plndNNNN6lBgwbq2rWr9e1/aWlp+vjjj+Xr66vx48eXSKNl3ciRIzVs2DDrudvtLlJwNqXZFAAAAEpEsUJzixYttHbtWo0aNUqffPKJ/vzzT0lSQECAOnTooKSkJIWFhZVIo1FRUZKkffv2qWrVqtb2ffv2qXnz5lbN/v37PV538uRJHT582Hp9VFSU9u3b51FT8NyupmD/mbhcLrlcrgs4MwAAAJR1xZ5w3LBhQ3300Udyu93au3ev9u7dK7fbrQ8//FCffvppiU1TqFWrlqKiorR06VJrm9vt1tq1axUfHy9Jio+PV2ZmplJSUqyar776Svn5+YqLi7NqVq5cqRMnTlg1ycnJql+/vkJDQ62aU9+noKbgfQAAAHB5KZlP6emvDwVGRkYqMjLygj/8l52drdTUVKWmpkr668N/qamp2rVrlxwOh4YOHar//Oc/+uSTT7Rlyxb985//VHR0tLp06SJJuvrqq9WhQwf1799f69at06pVqzR48GD17NlT0dHRkqS7775bTqdT/fr107Zt2zR37ly98sorHlMrhgwZosWLF+vFF1/UDz/8oKSkJK1fv16DBw8u1hgBAACgfCqxr9EuCevXr1fbtm2t5wVBtnfv3po5c6Yee+wxHT16VA888IAyMzN14403avHixapYsaL1mtmzZ2vw4MFq166dfHx81L17d7366qvW/uDgYH3xxRcaNGiQYmNjFRYWptGjR3us5Xz99dfrvffe05NPPqknnnhCV111lRYsWKDGjRtfhFEAAABAWeMwxpTaZ9GefvppjR49Wnl5eaX1FmWW2+1WcHCwsrKyFBQUVGj/1N279a8dO9QtLEz/I4wDAABcdHZ57VQlNj0DAAAAuFSd9/SMDRs2FLl2z54953t4AAAAoMw579DcsmVLORyOItUaY4pce7lhVAAAAMqP8w7NM2bMKI0+AAAAgDLrvENz7969S6MPAAAAoMzig4AAAACADUKzl5Xaen8AAAAoMYRmAAAAwAahGQAAALBBaAYAAABsEJoBAAAAG4RmAAAAwAahGQAAALBBaAYAAABsEJoBAAAAG4RmL3E4HN5uAQAAAEVEaAYAAABsEJoBAAAAG4RmAAAAwAah2cuMtxsAAACALUIzAAAAYIPQDAAAANggNAMAAAA2CM0AAACADUIzAAAAYIPQDAAAANggNAMAAAA2CM0AAACADUKzlzi83QAAAACKjNAMAAAA2CA0AwAAADYIzQAAAIANQrOXGWO83QIAAABsEJoBAAAAG4RmAAAAwAahGQAAALBBaAYAAABsEJoBAAAAG4RmAAAAwAahGQAAALBBaAYAAABsEJoBAAAAG4RmL3F4uwEAAAAUGaEZAAAAsEFo9jLj7QYAAABgi9AMAAAA2CA0AwAAADYIzQAAAIANQjMAAABgg9AMAAAA2CA0AwAAADYIzQAAAIANQjMAAABgg9AMAAAA2CA0AwAAADbKVWhOSkqSw+HweDRo0MDaf/z4cQ0aNEhXXHGFAgMD1b17d+3bt8/jGLt27VKnTp0UEBCgiIgIDR8+XCdPnvSoWb58ua655hq5XC7VrVtXM2fOLPFzcZT4EQEAAFBaylVolqRGjRpp79691uObb76x9j3yyCP69NNPNX/+fK1YsUJ79uxRt27drP15eXnq1KmTcnNztXr1ar399tuaOXOmRo8ebdWkp6erU6dOatu2rVJTUzV06FDdf//9WrJkyUU9TwAAAJQdft5u4Hz5+fkpKiqq0PasrCy9+eabeu+993TLLbdIkmbMmKGrr75a3377rVq1aqUvvvhC27dv15dffqnIyEg1b95c48aN04gRI5SUlCSn06lp06apVq1aevHFFyVJV199tb755hu9/PLLSkxMPGtfOTk5ysnJsZ673e4inY85n5MHAACAV5S7O807duxQdHS0ateurV69emnXrl2SpJSUFJ04cUIJCQlWbYMGDVS9enWtWbNG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42l3h7kAHwQEAAAAbBCaAQAAABuEZi9yuVwaM2aMXC6Xt1u5JDCeJYvxLHmMacliPEsW41nyGNOS5e3x5IOAAAAAgA3uNAMAAAA2CM0AAACADUIzAAAAYIPQDAAAANggNHvJ5MmTVbNmTVWsWFFxcXFat26dt1sqE1auXKnOnTsrOjpaDodDCxYs8NhvjNHo0aNVtWpV+fv7KyEhQTt27PCoOXz4sHr16qWgoCCFhISoX79+ys7O9qjZvHmzWrdurYoVKyomJkYTJkwo7VPzivHjx+vaa69V5cqVFRERoS5duigtLc2j5vjx4xo0aJCuuOIKBQYGqnv37tq3b59Hza5du9SpUycFBAQoIiJCw4cP18mTJz1qli9frmuuuUYul0t169bVzJkzS/v0LrqpU6eqadOm1sL68fHxWrRokbWfsSyeZ599Vg6HQ0OHDrW2MabnJykpSQ6Hw+PRoEEDaz/jef52796te+65R1dccYX8/f3VpEkTrV+/3trP76XzU7NmzULXqMPh0KBBgySV8WvU4KKbM2eOcTqd5q233jLbtm0z/fv3NyEhIWbfvn3ebs3rPv/8czNq1Cjz4YcfGknmo48+8tj/7LPPmuDgYLNgwQKzadMmc8cdd5hatWqZY8eOWTUdOnQwzZo1M99++635+uuvTd26dc1dd91l7c/KyjKRkZGmV69eZuvWreb99983/v7+5vXXX79Yp3nRJCYmmhkzZpitW7ea1NRUc9ttt5nq1aub7Oxsq+bBBx80MTExZunSpWb9+vWmVatW5vrrr7f2nzx50jRu3NgkJCSYjRs3ms8//9yEhYWZkSNHWjU///yzCQgIMMOGDTPbt283r732mvH19TWLFy++qOdb2j755BOzcOFC8+OPP5q0tDTzxBNPmAoVKpitW7caYxjL4li3bp2pWbOmadq0qRkyZIi1nTE9P2PGjDGNGjUye/futR4HDhyw9jOe5+fw4cOmRo0apk+fPmbt2rXm559/NkuWLDE7d+60avi9dH7279/vcX0mJycbSWbZsmXGmLJ9jRKaveC6664zgwYNsp7n5eWZ6OhoM378eC92VfacHprz8/NNVFSUef75561tmZmZxuVymffff98YY8z27duNJPPdd99ZNYsWLTIOh8Ps3r3bGGPMlClTTGhoqMnJybFqRowYYerXr1/KZ+R9+/fvN5LM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",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "ename": "NameError",
     "evalue": "name 'epoch' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[7], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mplotLearningCurve\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtrain_mse_loss_hist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtest_regret_hist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m50\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Research/Implicit-Networks/fpo-dys/src/warcraft/utils.py:21\u001b[0m, in \u001b[0;36mplotLearningCurve\u001b[0;34m(loss_log, regret_log, epochs)\u001b[0m\n\u001b[1;32m     19\u001b[0m plt\u001b[38;5;241m.\u001b[39mxticks(fontsize\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m10\u001b[39m)\n\u001b[1;32m     20\u001b[0m plt\u001b[38;5;241m.\u001b[39myticks(fontsize\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m10\u001b[39m)\n\u001b[0;32m---> 21\u001b[0m plt\u001b[38;5;241m.\u001b[39mxlim(\u001b[38;5;241m-\u001b[39m\u001b[43mepoch\u001b[49m\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m50\u001b[39m, epochs\u001b[38;5;241m+\u001b[39mepoch\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m50\u001b[39m)\n\u001b[1;32m     22\u001b[0m plt\u001b[38;5;241m.\u001b[39mylim(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;28mmax\u001b[39m(regret_log[\u001b[38;5;241m1\u001b[39m:])\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m1.1\u001b[39m)\n\u001b[1;32m     23\u001b[0m plt\u001b[38;5;241m.\u001b[39mxlabel(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEpochs\u001b[39m\u001b[38;5;124m\"\u001b[39m, fontsize\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m12\u001b[39m)\n",
      "\u001b[0;31mNameError\u001b[0m: name 'epoch' is not defined"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotLearningCurve(train_mse_loss_hist, test_regret_hist, 50)\n",
    "evaluate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "fpo-dys",
   "language": "python",
   "name": "fpo-dys"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
